/*
 * @title memCentrale.h
 * @brief Mémoire Centrale et Macros utilisés pour les instructions.
 * @author Nathalie Kauv & Laura Martellotto
 *
 * @date 16 déc. 2011
 *
 */

#ifndef MEMCENTRALE_H
#define MEMCENTRALE_H

#define TAILLE_MEM 60

/**
 * @union mot
 * @brief Objet représentant une mot pouvant être stocké en mémoire
 *
 * Cette union permet de représenter à la fois un mot instruction (avec un code opération,
 * un code de mode d'adressage, un opérande source et un opérande destination) mais aussi,
 * un mot brut de la mémoire.
 */
typedef union
{
    short brut;
    struct
    {
        unsigned codeop : 6;
        unsigned mode : 4;
        unsigned source : 3;
        unsigned dest : 3;
    }codage;
} mot;

/**
 * @enum operateur
 * @brief Enumération de tous les codes instructions.
 */
typedef enum
{
    LOAD = 0x8,
    STORE = 0x9,
    ADD = 0x0,
    SUB = 0x1,
    JMP = 0x4,
    JEQ = 0xA,
    CALL = 0x5,
    RET = 0xB,
    PUSH = 0xC,
    POP = 0x20,
    HALT = 0xD,
    UNKNOWN = 0xF
} operateur;


/**
 * @enum modeop
 * @brief Enumération de tous les codes de mode d'adressage.
 */
typedef enum
{
    REGREG = 0x0,
    REGIMM = 0x4,
    REGDIR = 0x8,
    REGIND = 0xC,
    DIRIMM = 0x5,
    DIRREG = 0x1,
    INDIMM = 0x6,
    INDREG = 0x2
} modeop;

/**
 * Tableau de "mot" représentant la mémoire (la taille étant TAILLE_MEM).
 */
mot memoire [TAILLE_MEM];

#endif /* MEMCENTRALE_H */
